import axios from 'axios'
import type { AxiosResponse } from 'axios'
import { showFailToast } from 'vant'

// 定义统一的响应格式
export interface StandardResponse<T = any> {
  data: T
  status: number
}

// 定义通用的API响应类型
export interface ApiResponse<T = any> {
  status: number
  msg?: string
  message?: string  // 支持注册等接口使用message字段
  data?: T
}

// 定义登录响应类型
export interface LoginResponse {
  status: number
  token: string
  username: string
}

// 定义请求配置类型（为将来扩展预留）
// interface RequestConfig extends AxiosRequestConfig {
//   showLoading?: boolean
//   showError?: boolean
// }

// 创建axios实例
const service = axios.create({
  baseURL: '/api', // 使用相对路径，配合Vite代理
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json'
  }
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么

    // 添加token到请求头
    // const token = localStorage.getItem('token')
    // if (token) {
    //   config.headers['Authorization'] = `Bearer ${token}`
    // }

    return config
  },
  error => {
    // 对请求错误做些什么
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse<any>) => {
    // 对响应数据做点什么
    const { data } = response

    // 检查响应是否包含标准格式 {status, msg/message, data}
    if (typeof data === 'object' && data !== null && 'status' in data) {
      // 标准格式的API响应
      if (data.status === 200) {
        // 统一返回 {data, status} 结构
        // 兼容两种后端返回：
        // 1) { status: 200, data: T } -> 返回 { data: T, status: 200 }
        // 2) { status: 200, token, username } -> 返回 { data: { token, username }, status: 200 }
        const responseData = (data as any).data !== undefined 
          ? (data as any).data 
          : (() => {
              // 提取除了 status、msg、message 之外的所有字段作为 data
              const { status, msg, message, ...rest } = data
              return rest
            })()
        return { data: responseData, status: data.status } as any
      } else if (data.status === 500) {
        // 特殊处理状态码500（通常表示没有更多数据），不显示错误提示
        return { data: (data as any).data, status: data.status } as any
      } else {
        // 处理其他业务错误 - 支持 msg、message 字段
        const errorMsg = data.msg || data.message || '请求失败'
        showFailToast(errorMsg)
        return Promise.reject(new Error(errorMsg))
      }
    } else {
      // 非标准格式，直接返回（如 /banner 接口返回数组）
      return { data: data, status: 200 } as any
    }
  },
  error => {
    // 对响应错误做点什么
    console.error('响应错误:', error)
    
    if (error.response) {
      const { status, data } = error.response
      
      switch (status) {
        case 401:
          showFailToast('登录已过期，请重新登录')
          // 清除token并跳转到登录页
          localStorage.removeItem('token')
          localStorage.removeItem('userInfo')
          // 这里可以添加路由跳转到登录页
          // router.push('/login')
          break
        case 403:
          showFailToast('没有权限访问')
          break
        case 404:
          showFailToast('请求的资源不存在')
          break
        case 500:
          showFailToast('服务器内部错误')
          break
        default:
          showFailToast(data?.msg || '网络错误')
      }
    } else if (error.request) {
      showFailToast('网络连接失败，请检查网络')
    } else {
      showFailToast('请求配置错误')
    }
    
    return Promise.reject(error)
  }
)

// 封装GET请求
export function get<T = any>(url: string, params: Record<string, any> = {}): Promise<StandardResponse<T>> {
  return service.get(url, { params })
}

// 封装POST请求
export function post<T = any>(url: string, data: Record<string, any> = {}): Promise<StandardResponse<T>> {
  return service.post(url, data)
}

// 封装PUT请求
export function put<T = any>(url: string, data: Record<string, any> = {}): Promise<StandardResponse<T>> {
  return service.put(url, data)
}

// 封装DELETE请求
export function del<T = any>(url: string, params: Record<string, any> = {}): Promise<StandardResponse<T>> {
  return service.delete(url, { params })
}

// 封装PATCH请求
export function patch<T = any>(url: string, data: Record<string, any> = {}): Promise<StandardResponse<T>> {
  return service.patch(url, data)
}

// 封装文件上传
export function upload<T = any>(
  url: string, 
  file: File, 
  onProgress?: (progressEvent: any) => void
): Promise<StandardResponse<T>> {
  const formData = new FormData()
  formData.append('file', file)
  
  return service.post(url, formData, {
    headers: {
      'Content-Type': 'multipart/form-data'
    },
    onUploadProgress: onProgress
  })
}

// 封装多文件上传
export function uploadMultiple<T = any>(
  url: string, 
  files: File[], 
  onProgress?: (progressEvent: any) => void
): Promise<StandardResponse<T>> {
  const formData = new FormData()
  files.forEach((file, index) => {
    formData.append(`files[${index}]`, file)
  })
  
  return service.post(url, formData, {
    headers: {
      'Content-Type': 'multipart/form-data'
    },
    onUploadProgress: onProgress
  })
}

// 导出axios实例
export default service 